/**
 * @module 有关地理位置信息
 */

import { AreaList, areaList } from "./areaList";

export {
  GetArea,
  Select
};

/**
 * @interface 返回值范式
 */
interface Area {
  province: Array<AreaList>,
  provinceList: Array<string>,
  cityList: Array<string>,
  regionList: Array<string>,
  cityID: Array<string>, // 市区id
}
/**
 * @interface 地区多列选择器改变传参范式
 */
interface Select {
  column: 0 | 1, // 列数 0: 省份；1: 地市；2: 地区
  value: number, // 该列当前指向
  present: {
    city: Array<string>;
    cityID: Array<string>; // 地市ID
  }
}
/**
 * @function 获取省市列表，课程筛选界面通过这里初始化/动态处理省市多列选择器
 * @const PROVINCE 省级列表，不变
 */
const PROVINCE: Array<AreaList> = [];
Array.prototype.push.apply(PROVINCE, areaList.filter((item) => {
  return item.pid.length == 0;
})) // 获取省级单位列表(省级列表无需改变)

const GetArea = (select?: Select): Area => {
  const city: Array<AreaList> = [], region: Array<AreaList> = [];
  if(select) {
    // 有入参 => 地区选择器改变
    switch(select.column) {
      case 0:
        // 省区改变，地市和地区随之改变
        Array.prototype.push.apply(city, areaList.filter((item) => {
          return item.pid == PROVINCE[select.value].id;
        })) // 获取市级单位列表
        Array.prototype.push.apply(region, areaList.filter((item) => {
          return item.pid == city[0].id;
        })) // 获取区级单位列表
        break;
      case 1:
        // 地市改变，地区随之改变
        Array.prototype.push.apply(city, select.present.city) // 获取市级单位列表
        Array.prototype.push.apply(region, areaList.filter((item) => {
          return item.pid == select.present.cityID[select.value];
        }))
        break;
    }
  }
  else {
    // 无入参，初始化
    Array.prototype.push.apply(city, areaList.filter((item) => {
      return item.pid == PROVINCE[0].id;
    })) // 获取市级单位列表
    Array.prototype.push.apply(region, areaList.filter((item) => {
      return item.pid == city[0].id;
    })) // 获取区级单位列表
  }
  const area: Area = {
    province: PROVINCE,
    provinceList: PROVINCE.map(item => { return item.name; }),
    cityList: !select || select?.column == 0 ? city.map(item => { return item.name; }) || select?.present.city : select.present.city, // 市区选择器改变时，直接返回传入的当前城市列表
    regionList: region.map(item => { return item.name; }),
    cityID: !select || select.column == 0 ? city.map(item => {return item.id}) : select.present.cityID, // 市区选择器改变时，直接返回传入的当前城市ID列表
  } 
  return area;
}